#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
在线密码管理平台 - 启动脚本
子鞍科技股份有限公司
"""

import os
import sys
import subprocess
import configparser
from modules.utils.config import load_config, create_default_config
from modules.database.connection import init_database
from modules.calendar.tasks import calendar_task_manager

def check_requirements():
    """检查依赖包是否安装"""
    try:
        import fastapi
        import uvicorn
        import jinja2
        import fastapi
        import  pandas
        import  openpyxl
        import  xlrd
        import  starlette
        import  pytz
        import  psutil
        print("✓ 所有依赖包已安装")
        return True
    except ImportError as e:
        print(f"✗ 缺少依赖包: {e}")
        print("请运行: pip install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple/ ")
        return False

def check_config():
    """检查配置文件"""
    config_path = 'config/config.ini'
    create_default_config()
    if not os.path.exists(config_path):
        print("✗ 配置文件不存在，将创建默认配置")
        return False
    
    config = configparser.ConfigParser()
    config.read(config_path, encoding='utf-8')
    
    required_keys = ['app_name', 'company_short', 'company_full', 'web_port', 'admin_username', 'admin_password']
    for key in required_keys:
        if not config.has_option('DEFAULT', key):
            print(f"✗ 配置文件缺少必要配置项: {key}")
            return False
    
    print("✓ 配置文件检查通过")
    return True

def check_directories():
    """检查必要目录"""
    directories = ['config', 'data', 'templates', 'static', 'static/css', 'static/js']
    
    for directory in directories:
        if not os.path.exists(directory):
            print(f"✗ 目录不存在: {directory}")
            return False
    
    print("✓ 目录结构检查通过")
    return True

def check_static_files():
    """检查静态文件"""
    required_files = [
        'static/css/bootstrap.min.css',
        'static/css/fontawesome.min.css',
        'static/css/style.css',
        'static/js/bootstrap.bundle.min.js',
        'static/js/jquery.min.js',
        'static/js/app.js'
    ]
    
    missing_files = []
    for file_path in required_files:
        if not os.path.exists(file_path):
            missing_files.append(file_path)
    
    if missing_files:
        print("✗ 缺少静态文件:")
        for file_path in missing_files:
            print(f"  - {file_path}")
        return False
    
    print("✓ 静态文件检查通过")
    return True

def main():
    """主函数"""
    print("=" * 50)
    print("在线密码管理平台 - 启动检查")
    print("子鞍科技股份有限公司")
    print("=" * 50)
    
    # 检查Python版本
    if sys.version_info < (3, 8):
        print("✗ Python版本过低，需要Python 3.8+")
        sys.exit(1)
    print(f"✓ Python版本: {sys.version}")
    
    # 执行各项检查
    checks = [
        ("依赖包检查", check_requirements),
        ("目录结构检查", check_directories),
        ("配置文件检查", check_config),
        ("静态文件检查", check_static_files)
    ]
    
    all_passed = True
    for check_name, check_func in checks:
        print(f"\n{check_name}...")
        if not check_func():
            all_passed = False
    
    if not all_passed:
        print("\n✗ 启动检查失败，请解决上述问题后重试")
        sys.exit(1)
    
    print("\n" + "=" * 50)
    print("✓ 所有检查通过，正在加载配置...")
    # 加载配置
    load_config()
    print("✓ 配置加载完成，正在初始化数据库...")
    # 初始化数据库
    init_database()
    print("✓ 数据库初始化完成，正在启动应用...")
    print("=" * 50)
    
    # 启动日历任务管理器
    print("正在启动日历任务管理器...")
    calendar_task_manager.start()
    print("✓ 日历任务管理器已启动")
    
    # 启动应用
    try:
        # 读取配置获取端口
        config = configparser.ConfigParser()
        config.read('config/config.ini', encoding='utf-8')
        port = config.get('DEFAULT', 'web_port', fallback='8090')
        
        print(f"应用启动地址: http://localhost:{port}")
        print(f"接口文档地址: http://localhost:{port}/docs")
        print("按 Ctrl+C 停止应用")
        print("-" * 50)
        # 杀掉占用8090端口的进程
        command = f"lsof -ti:{port} | xargs kill -9 2>/dev/null || true"
        subprocess.run(command, shell=True, check=False, text=True, capture_output=True)
        # 启动uvicorn服务器
        subprocess.run([
            sys.executable, '-m', 'uvicorn', 
            'app:app', 
            '--host', 'localhost',
            '--port', port,
            '--reload'
        ])
        
    except KeyboardInterrupt:
        print("\n应用已停止")
    except Exception as e:
        print(f"\n启动失败: {e}")
        sys.exit(1)

if __name__ == "__main__":
    main()